package main

import "fmt"
import "os"
import "encoding/json"

// 定义结构体
type response1 struct {
    Page int
    Fruits []string
}
// 定义结构体并指定Json
type response2 struct {
    Page int `json:"page"`
    Fruits []string `json:"fruits"`
}

func main() {
    // bool
    bolB, _ := json.Marshal(true)
    fmt.Println(string(bolB))
    
    //int
    intB, _ := json.Marshal(1)
    fmt.Println(string(intB))
    
    // float
    fltB, _ := json.Marshal(2.34)
    fmt.Println(string(fltB))
    
    // string
    strB, _ := json.Marshal("gopher")
    fmt.Println(string(strB))

    // slice
    slcD := []string{"apple", "peach", "pear"}
    slcB, _ := json.Marshal(slcD)
    fmt.Println(string(slcB))
    
    // map
    mapD := map[string]int{"apple": 5, "lettuce": 7}
    mapB, _ := json.Marshal(mapD)
    
    fmt.Println(string(mapB))
    
    // 结构 体
    res1D := &response1{
        Page: 1,
        Fruits: []string{"apple", "peach", "pear"}}
    res1B, _ := json.Marshal(res1D)
    fmt.Println(string(res1B))
    
    // 结构体 json
    res2D := &response2{
        Page: 1,
        Fruits: []string{"apple", "peach", "pear"}}
    res2B, _ := json.Marshal(res2D)
    fmt.Println(string(res2B))
    // string json to map
    byt := []byte(`{"num":6.13, "strs":["a", "b"]}`)
    var dat map[string]interface{}
    if err := json.Unmarshal(byt, &dat); err != nil {
        panic(err)
    }
    fmt.Println(dat)

    num := dat["num"].(float64)
    fmt.Println(num)
    
    strs := dat["strs"].([]interface{})
    str1 := strs[0].(string) 
    fmt.Println(str1)
    // string to json
    str := `{"page": 1, "fruits": ["apple", "peach"]}`
    res := response2{}
    json.Unmarshal([]byte(str), &res)
    fmt.Println(res)
    fmt.Println(res.Fruits[0])
 

    enc := json.NewEncoder(os.Stdout)
    d := map[string]int{"apple":5, "lettuce":7}
    enc.Encode(d)
    
    fmt.Println(d)
}
